home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 06 (1989-06)(MindCraft Publishing)(Side A)[a].zip
/
Nibble Volume 10, No. 06 (1989-06)(MindCraft Publishing)(Side A)[a].po
/
EXTERMINATORS.bas
< prev
next >
Wrap
BASIC Source File
|
1996-12-24
|
10KB
|
233 lines
10 REM ****************************
20 REM * EXTERMINATORS *
30 REM * BY DAVID HARRIS *
40 REM * COPYRIGHT(C) 1989 *
50 REM * MICROSPARC, INC. *
60 REM * CONCORD, MA 01742 *
70 REM ****************************
80 REM
90 REM ** MAIN PROGRAM **
100 GOSUB 160: REM INITIALIZE
110 GOSUB 330: REM NEW GAME
120 GOSUB 590: REM PLAY GAME
130 GOSUB 1390: REM GAME OVER
140 GOTO 110
150 REM ** INITIALIZE **
160 IF PEEK(104) = 66 THEN GOTO 190
170 POKE 103,1: POKE 104,66: POKE 16896,0
180 PRINT CHR$(4);"RUN EXTERMINATORS"
190 PRINT CHR$(12); CHR$(21)
200 HCOLOR= 3: SCALE= 1: ROT= 0
210 ONERR GOTO 2180
220 PRINT CHR$(4);"BLOAD EXTERM.SHAPES,A$4000"
230 PRINT CHR$(4);"BLOAD EXTERM.SOUND"
240 POKE 216,0: ONERR GOTO 1760
250 SD = 0: POKE 842,SD: REM ENABLE SOUND
260 POKE 232,0: POKE 233,64
270 MAXDAL = 50
280 DIM MA%(19,9)
290 DIM N$(11),S(11),L(11)
300 DIM DX%(MAXDAL): DIM DY%(MAXDAL)
310 RETURN
320 REM ** NEW GAME **
330 DAL = 5:LEVEL = 1:LS = 0:SCO = 0:DEAD = 0
340 HOME : INVERSE : HTAB 1: VTAB 21: PRINT " EXTERMINATORS (C) 1989 MICROSPARC, INC.";: NORMAL
350 GOSUB 390
360 VTAB 24: PRINT "'?' for Instructions, 'ESC' to Quit.";: VTAB 1: PRINT
370 RETURN
380 REM ** NEW BOARD **
390 VTAB 23: HTAB 1: PRINT "Score: ";SCO;" Level: ";LEVEL: REM 9 SPACES
400 IF DAL >MAXDAL THEN DAL = MAXDAL
410 FOR A = 0 TO 19: FOR B = 0 TO 9:MA%(A,B) = 0: NEXT B: NEXT A
420 DDAL = 0:S = 0
430 FOR L = 1 TO DAL
440 DX%(L) = INT(20 * RND(1)):DY%(L) = INT(10 * RND(1))
450 IF MA%(DX%(L),DY%(L)) >0 THEN GOTO 440
460 MA%(DX%(L),DY%(L)) = 2
470 NEXT L
480 PX = INT(18 * RND(1)) +1:PY = INT(8 * RND(1)) +1
490 CHK = 0: FOR A = -1 TO 1: FOR B = -1 TO 1:CHK = CHK +MA%(PX +A,PY +B): NEXT B: NEXT A
500 IF CHK >0 THEN GOTO 480
510 MA%(PX,PY) = 1
520 HGR
530 VTAB 1: IF OF THEN HCOLOR= 3: GOSUB 2310
540 FOR L = 1 TO DAL: XDRAW 2 AT DX%(L) *14,DY%(L) *16: NEXT L
550 XDRAW 1 AT PX *14,PY *16
560 POKE -16368,0
570 RETURN
580 REM ** PLAY GAME **
590 IF NOT LS THEN GOSUB 660: REM GET PLAYERS MOVE IF NOT LAST STAND
600 IF DEAD = 1 THEN GOTO 620
610 GOSUB 980: REM MOVE EXTERMINATORS
620 IF DDAL = DAL THEN GOSUB 2090: GOSUB 390
630 IF NOT DEAD THEN GOTO 590
640 RETURN
650 REM ** GET PLAYERS MOVE **
660 VTAB 1
670 MV = 0: GET M$:M = ASC(M$): IF M >96 AND M <123 THEN M = M -32
680 IF M = 71 THEN GOSUB 2300
690 IF M = 77 THEN MV = 1
700 IF M = 44 OR M = 60 THEN MV = 2
710 IF M = 46 OR M = 62 THEN MV = 3
720 IF M = 74 THEN MV = 4
730 IF M = 75 THEN MV = 5
740 IF M = 76 THEN MV = 6
750 IF M = 85 THEN MV = 7
760 IF M = 73 THEN MV = 8
770 IF M = 79 THEN MV = 9
780 IF M >48 AND M <58 THEN MV = M -48
790 IF M = 27 THEN GOTO 1550
800 IF M = 19 THEN GOSUB 2060: GOTO 660
810 IF M = 83 OR M = 115 THEN E = 1: GOSUB 1240: IF E THEN RETURN
820 IF M = 84 OR M = 116 THEN GOSUB 1160: RETURN
830 IF M = 63 OR M = 47 THEN GOSUB 1800: GOTO 660
840 IF M = 87 OR M = 119 THEN LS = 1: RETURN
850 IF M = 32 THEN RETURN
860 IF NOT MV THEN GOTO 670
870 MA%(PX,PY) = 0
880 XDRAW 1 AT PX *14,PY *16
890 IF (MV = 1 OR MV = 4 OR MV = 7) AND PX >0 THEN PX = PX -1
900 IF (MV = 9 OR MV = 6 OR MV = 3) AND PX <19 THEN PX = PX +1
910 IF (MV = 7 OR MV = 8 OR MV = 9) AND PY >0 THEN PY = PY -1
920 IF (MV = 1 OR MV = 2 OR MV = 3) AND PY <9 THEN PY = PY +1
930 XDRAW 1 AT PX *14,PY *16
940 IF MA%(PX,PY) >0 THEN DEAD = 1: RETURN
950 MA%(PX,PY) = 1
960 RETURN
970 REM ** MOVE EXTERMINATORS **
980 FOR L = 1 TO DAL: IF DX%(L) = -1 THEN NEXT L: GOTO 1010
990 IF MA%(DX%(L),DY%(L)) = 1 THEN DEAD = 1: RETURN
1000 XDRAW 2 AT DX%(L) *14,DY%(L) *16:MA%(DX%(L),DY%(L)) = 0: NEXT L
1010 FOR L = 1 TO DAL
1020 IF DX%(L) = -1 THEN NEXT L: RETURN
1030 IF PX >DX%(L) THEN DX%(L) = DX%(L) +1
1040 IF PX <DX%(L) THEN DX%(L) = DX%(L) -1
1050 IF PY >DY%(L) THEN DY%(L) = DY%(L) +1
1060 IF PY <DY%(L) THEN DY%(L) = DY%(L) -1
1070 IF MA%(DX%(L),DY%(L)) = 0 THEN XDRAW 2 AT DX%(L) *14,DY%(L) *16:MA%(DX%(L),DY%(L)) = 2: NEXT L: RETURN
1080 IF MA%(DX%(L),DY%(L)) = 1 THEN XDRAW 2 AT DX%(L) *14,DY%(L) *16:DEAD = 1: RETURN
1090 IF MA%(DX%(L),DY%(L)) = 3 THEN DDAL = DDAL +1:DX%(L) = -1:SCO = SCO +10: VTAB 23: PRINT "Score: ";SCO: POKE 6,255: POKE 8,50: CALL 843: NEXT L: RETURN
1100 MA%(DX%(L),DY%(L)) = 3
1110 XDRAW 2 AT DX%(L) *14,DY%(L) *16
1120 DDAL = DDAL +2:SCO = SCO +20: VTAB 23: PRINT "Score: ";SCO: FOR C = 1 TO L -1
1130 IF DX%(C) = DX%(L) AND DY%(C) = DY%(L) THEN XDRAW 3 AT DX%(L) *14,DY%(L) *16:DX%(C) = -1
1140 NEXT C:DX%(L) = -1: POKE 6,255: POKE 8,150: CALL 843: NEXT L: RETURN
1150 REM ** TELEPORT **
1160 MA%(PX,PY) = 0
1170 XDRAW 1 AT PX *14,PY *16
1180 PX = INT(18 * RND(1)) +1:PY = INT(8 * RND(1)) +1
1190 IF MA%(PX,PY) >0 THEN DEAD = 1
1200 MA%(PX,PY) = 1
1210 XDRAW 1 AT PX *14,PY *16
1220 RETURN
1230 REM ** SONIC SCREWDRIVER **
1240 IF S THEN E = 0: RETURN
1250 S = 1:C = 50
1260 FOR A = -1 TO 1: FOR B = -1 TO 1
1270 X = PX +A:Y = PY +B: IF X <0 OR Y <0 OR X >19 OR Y >9 OR (A = 0 AND B = 0) THEN NEXT B: NEXT A: RETURN
1280 XDRAW 4 AT X *14,Y *16: FOR L = 1 TO C: NEXT L
1290 IF MA%(X,Y) = 2 THEN POKE 6,255: POKE 8,100: CALL 843
1300 XDRAW 4 AT X *14,Y *16
1310 IF MA%(X,Y) < >2 THEN NEXT B: NEXT A: RETURN
1320 MA%(X,Y) = 0: XDRAW 2 AT X *14,Y *16
1330 DDAL = DDAL +1:SCO = SCO +20: VTAB 23: PRINT "Score: ";SCO
1340 FOR L = 1 TO DAL
1350 IF DX%(L) = X AND DY%(L) = Y THEN DX%(L) = -1:L = DAL
1360 NEXT L: NEXT B: NEXT A
1370 RETURN
1380 REM ** GAME OVER **
1390 VTAB 24: PRINT "You were hit...Game over... ";: VTAB 1: REM 9 SPACES
1400 GOSUB 2220
1410 GOSUB 1570: REM HALL OF FAME
1420 TEXT : HOME
1430 PRINT "You were hit...Game over..."
1440 PRINT "You reached level ";LEVEL;" scoring ";SCO;"."
1450 GOSUB 1650
1460 PRINT : HTAB 14: INVERSE : PRINT "HALL OF FAME": NORMAL : PRINT : PRINT "WINNER","SCORE","LEVEL"
1470 PRINT
1480 FOR L = 1 TO 10: PRINT N$(L),S(L),L(L): NEXT L
1490 PRINT : PRINT "Play Again (Y/N) ";: FLASH : PRINT "Y";
1500 NORMAL
1510 A = PEEK( -16368): IF A <128 THEN GOTO 1510
1520 P$ = CHR$(A -128): POKE -16384,0
1530 IF P$ = "Y" OR P$ = CHR$(121) OR P$ = CHR$(13) THEN GOTO 110
1540 IF P$ < >"N" AND P$ < > CHR$(110) AND P$ < > CHR$(27) THEN GOTO 1510
1550 TEXT : HOME : PRINT "Play EXTERMINATORS again, soon!": END
1560 REM ** HALL OF FAME **
1570 EFLAG = 0: ONERR GOTO 1760
1580 PRINT CHR$(4);"VERIFY EXTERM.FAME"
1590 PRINT CHR$(4);"OPEN EXTERM.FAME"
1600 PRINT CHR$(4);"READ EXTERM.FAME"
1610 FOR L = 1 TO 10: INPUT N$(L),S(L),L(L): NEXT L
1620 PRINT CHR$(4);"CLOSE EXTERM.FAME"
1630 RETURN
1640 REM ** GET WINNERS NAME **
1650 FOR L = 1 TO 10: IF SCO <S(L) THEN NEXT L: GOTO 1710
1660 FOR C = 10 TO L STEP -1:N$(C +1) = N$(C):S(C +1) = S(C):L(C +1) = L(C): NEXT C
1670 PRINT : INPUT "Please enter your name: ";N$(L):S(L) = SCO:L(L) = LEVEL
1680 IF LEN(N$(L)) >15 THEN VTAB 3: CALL -958: VTAB 4: PRINT "(15 letters or less)": VTAB 2: GOTO 1670
1690 L = 10
1700 NEXT L
1710 PRINT CHR$(4);"OPEN EXTERM.FAME"
1720 PRINT CHR$(4);"WRITE EXTERM.FAME"
1730 FOR L = 1 TO 10: PRINT N$(L): PRINT S(L): PRINT L(L): NEXT L
1740 PRINT CHR$(4);"CLOSE EXTERM.FAME"
1750 RETURN
1760 EN = PEEK(222): IF EN = 6 OR EN = 5 THEN PRINT CHR$(4)"OPEN EXTERM.FAME": PRINT CHR$(4)"CLOSE EXTERM.FAME": GOTO 1420
1770 IF EN = 8 THEN HOME : TEXT : VTAB 1: PRINT "I/O ERROR... CHECK DISK DRIVE": END
1780 TEXT : HOME : VTAB 1: PRINT "ERROR #"EN" AT LINE #" PEEK(218) +256 * PEEK(219): END
1790 REM ** INSTRUCTIONS **
1800 TEXT : HOME
1810 HTAB 14: INVERSE : PRINT "INSTRUCTIONS": NORMAL : PRINT
1820 PRINT " Try to eliminate the EXTERMINATORS"
1830 PRINT " before they get you! EXTERMINATORS"
1840 PRINT " destroy each other when they collide."
1850 PRINT " Debris is lethal to EXTERMINATORS and"
1860 PRINT " you. When cornered, use the Sonic"
1870 PRINT " Screwdriver to destroy the adjacent"
1880 PRINT " EXTERMINATORS, or teleport away."
1890 PRINT " Use the following keys to move:"
1900 PRINT " U I O 7 8 9": REM 7 AND 11 SPACES
1910 PRINT " J K L or 4 5 6"
1920 PRINT " M , . 1 2 3"
1930 PRINT : PRINT " S-Sonic Screwdriver (once per level)"
1940 PRINT " Destroys all adjacent EXTERMINATORS": REM 3 SPACES
1950 PRINT " T-Teleport-Randomly relocates you"
1960 PRINT " W-Last Stand-Stand until end of level"
1970 PRINT " G-Toggles grid on/off"
1980 PRINT : PRINT " CTRL-S-Toggles sound on/off"
1990 VTAB 24: HTAB 8: INVERSE : PRINT "PRESS A KEY TO CONTINUE";
2000 POKE -16368,0: WAIT -16384,128: POKE -16368,0: POKE -16304,0
2010 HOME : INVERSE : VTAB 21: PRINT " EXTERMINATORS (C) 1989 MICROSPARC, INC.";: NORMAL
2020 VTAB 23: HTAB 1: PRINT "Score: ";SCO;" Level: ";LEVEL: REM 9 SPACES
2030 VTAB 24: PRINT "'?' for Instructions, 'ESC' to Quit.";: VTAB 1: PRINT
2040 RETURN
2050 REM ** SOUND ON/OFF **
2060 IF SN THEN SN = 0: POKE 842,0: RETURN
2070 SN = 1: POKE 842,255: RETURN
2080 REM ** LEVEL COMPLETE **
2090 LS = 0:DAL = DAL +3:LEVEL = LEVEL +1
2100 POKE 6,38: POKE 8,157: CALL 843
2110 POKE 6,64: POKE 8,116: CALL 843
2120 POKE 6,75: POKE 8,93: CALL 843
2130 POKE 6,255: POKE 8,77: CALL 843
2140 POKE 6,75: POKE 8,93: CALL 843
2150 POKE 6,255: POKE 8,77: CALL 843
2160 HGR
2170 RETURN
2180 REM ** ERROR LOADING FILE **
2190 IF PEEK(222) = 6 THEN HOME : PRINT "File not found.": PRINT "Make sure EXTERM.SHAPES and EXTERM.SOUND": PRINT "are on the disk.": END
2200 PRINT "Error loading file...": END
2210 REM ** DIRGE **
2220 RESTORE
2230 HCOLOR= 0: DRAW 1 AT PX *14,PY *16: HCOLOR= 3: DRAW 2 AT PX *14,PY *16
2240 FOR A = 1 TO 11: READ PITCH,DUR
2250 POKE 8,PITCH +125: POKE 6,DUR *31
2260 XDRAW 1 AT PX *14,PY *16: XDRAW 2 AT PX *14,PY *16
2270 CALL 843: NEXT A
2280 DATA 121,4,121,3,121,1,121,4,108,4,113,1,121,2,121,1,121,2,128,1,121,8
2290 RETURN
2300 OF = NOT OF: HCOLOR= 3 *OF
2310 FOR X = 13 TO 158 STEP 16: HPLOT 0,X TO 279,X: NEXT
2320 FOR X = 12 TO 270 STEP 14: HPLOT X,0 TO X,157: NEXT
2330 RETURN